package control;

import java.io.IOException;
import java.io.PrintWriter;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import swimv2.ejb.remote.AutenticazioneRemote;
import swimv2.ejb.remote.RegistrazioneRemote;
import swimv2.ejb.util.LoginToken;
import util.HtmlUtil;

/**
 * Servlet implementation class Registrazione
 */
public class Account extends Servlet {
	private static final long serialVersionUID = 1L;

	private HttpServletRequest request;
	private HttpServletResponse response;

	/**
	 * @see Servlet#Servlet()
	 */
	public Account() {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		this.request = request;
		this.response = response;
		String azione = (String) request.getParameter("azione");
		if (azione != null && azione.equals("login")) {
			showLogin(request, response);
			return;
		} else if (azione.equals("logout")) {
			doLogout();

		} else if (azione.equals("home")) {
			HtmlUtil.inviaHome(request, response);
		} else {

			request.setAttribute("titolo", "Registrazione");
			HtmlUtil.inviaHeader(request, response);
			HtmlUtil.inviaIntestazioneVisitatore(request, response);
			HtmlUtil.includi(request, response,
					"/WEB-INF/include/registrazione.jsp");
			HtmlUtil.inviaFooter(request, response);
		}
	}

	protected void showLogin(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("titolo", "Login");
		HtmlUtil.inviaHeader(request, response);
		HtmlUtil.includi(request, response, "/WEB-INF/include/login.jsp");
		HtmlUtil.inviaFooter(request, response);
	}

	protected void doLogin(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String username = (String) request.getParameter("username");
		String password = (String) request.getParameter("password");
		autentica(request, username, password);

	}

	protected void doLogout() throws ServletException, IOException {
		request.getSession().removeAttribute("LoginToken");
		HtmlUtil.redirect(this.request, this.response, "/");

	}

	protected void doRegistra(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		String nome = (String) request.getParameter("nome");
		String cognome = (String) request.getParameter("cognome");
		String username = (String) request.getParameter("username");
		String password = (String) request.getParameter("password");
		try {

			Context jndiContext;
			jndiContext = new javax.naming.InitialContext();
			Object ref1 = jndiContext.lookup("Registrazione/remote");
			RegistrazioneRemote registrazioneRemote = (RegistrazioneRemote) PortableRemoteObject
					.narrow(ref1, RegistrazioneRemote.class);
			registrazioneRemote.registra(nome, cognome, username, password);
			autentica(request, username, password);

		} catch (NamingException e) {
			// TODO Auto-generated catch block
			PrintWriter out = response.getWriter();

			out.println("errore<br>");
			e.printStackTrace();
		}

	}

	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		this.request = request;
		this.response = response;

		String azione = (String) request.getParameter("azione");

		if (azione != null && azione.equals("login")) {
			doLogin(request, response);
			return;
		}

		doRegistra(request, response);

	}

	private void autentica(HttpServletRequest request, String username,
			String password) {
		Context jndiContext;
		try {
			jndiContext = new javax.naming.InitialContext();
			Object ref1 = jndiContext.lookup("Autenticazione/remote");
			AutenticazioneRemote autenticazioneRemote = (AutenticazioneRemote) PortableRemoteObject
					.narrow(ref1, AutenticazioneRemote.class);
			LoginToken loginToken = autenticazioneRemote.login(username,
					password);
			request.getSession().removeAttribute("LoginToken");
			request.getSession().setAttribute("LoginToken", loginToken);

			if(loginToken == null)
			{
				request.getSession().setAttribute("Errore", "Login errato");
				HtmlUtil.redirect(request, this.response,"/");
				return;
			}
			if (loginToken.isUtente()) {
				HtmlUtil.redirect(request, this.response,
						"/HomeUtente?azione=logOk");
			} 
			

		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return;
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return;
	}

}
